package com.example.review.aop;

import com.example.review.tools.transformTools;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component  // 确保切面类被 Spring 管理
public class LoggingAspect {

    @Pointcut("execution(* com.example.review.service.impl.ReviewServiceImpl.*(..))")  // 拦截 ReviewServiceImpl 中所有方法
    public void serviceMethods() {
    }

    @Before("serviceMethods()")
    public void logBefore() {
        System.out.println("LoggingAspect: Method execution start @ " + transformTools.getCurrentDate());
    }

    @After("serviceMethods()")
    public void logAfter() {
        System.out.println("LoggingAspect: Method execution end @ " + transformTools.getCurrentDate());
    }

    // 使用环绕通知拦截目标方法
    @Around("serviceMethods()")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {

        // 获取目标方法的签名
        Signature signature = joinPoint.getSignature();

        // 将签名转换为 MethodSignature，以便访问方法信息
        MethodSignature methodSignature = (MethodSignature) signature;

        // 获取目标方法的信息
        Method method = methodSignature.getMethod();
        String methodName = method.getName();
        Object[] args = joinPoint.getArgs();

        // 使用反射打印方法信息
        System.out.println("Method " + methodName + " is called with parameters: ");
        for (Object arg : args) {
            System.out.println("  - " + arg);
        }

        // 修改方法参数（通过反射操作）
        if (args.length > 0 && args[0] instanceof String) {
            args[0] = ((String) args[0]).toUpperCase();  // 将第一个参数转换为大写
        }

        // 执行目标方法
        Object result = joinPoint.proceed(args);

        // 输出目标方法的返回值
        System.out.println("Method： " + methodName + " ; returned: " + transformTools.Object2Json(result));

        return result;
    }
}